package com.lagou.StageOne.Module3.Assignment.Assignment3;

import java.util.*;

/**
 * 3. 编程题
 *
 *  使用集合实现斗地主游戏的部分功能，要求如下：
 *
 *  （1）首先准备 54 张扑克牌并打乱顺序。
 *
 *  （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
 *
 *  （3）查看三个玩家手中的扑克牌和底牌。
 *
 *  （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
 *
 *     手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
 */
public class Assignment3 {


    static List<String> list = null;


    /**
     * 生成扑克牌
     * 将 1--A
     *   11--J
     *   12--Q
     *   13--K
     *   14--小王
     *   15--大王
     * 进行替换，除大小王，其他每张牌生成4张
     */
    public static void generateCards(){
        list = new ArrayList<>();
        for (int i = 1; i < 16; i++) {
            if (i==1){
                for (int j = 0; j < 4; j++) {
                    list.add("A");
                }
            } else if (i == 11) {
                for (int j = 0; j < 4; j++) {
                    list.add("J");
                }
            }else if (i == 12){
                for (int j = 0; j < 4; j++) {
                    list.add("Q");
                }
            }else if (i == 13){
                for (int j = 0; j < 4; j++) {
                    list.add("K");
                }
            }else if (i == 14){
                for (int j = 0; j < 1; j++) {
                    list.add("小王");
                }
            }else if (i == 15){
                for (int j = 0; j < 1; j++) {
                    list.add("大王");
                }
            }else {
                for (int j = 0; j < 4; j++) {
                    list.add(i+"");
                }
            }
            }
        //打乱顺序
        Collections.shuffle(list);
        System.out.println("扑克牌有:"+list.size());
        System.out.println("扑克牌为:"+list);
        int size = list.size();
        size = size-3;
        System.out.print("底牌为:");
        for (int i = size; i < list.size(); ) {
            System.out.print(list.get(i)+" ");
            list.remove(i);
        }

    }

    /**
     * 发牌  循环遍历第一张牌
     * 每次将发出去的一张牌在集合中将其删除
     * 保留三张底牌
     */
    public static String licensing(){
        for (int i = 0; i < list.size(); i++) {

            return (String)   list.remove(i);

        }
        return null;
    }

    /**
     * 将玩家手中的牌进行降序 排列
     * @param list
     * @return
     */
    public static List Sort(List <String>list){
        //先替换 成数字
        for (int i = 0; i < list.size(); i++) {
            if ("A".equals(list.get(i))){
                list.set(i,"1");
            }else if ("J".equals(list.get(i))){
                list.set(i,"11");
            }else if ("Q".equals(list.get(i))){
                list.set(i,"12");
            }else if ("K".equals(list.get(i))){
                list.set(i,"13");
            }else if ("小王".equals(list.get(i))){
                list.set(i,"14");
            }else if ("大王".equals(list.get(i))){
                list.set(i,"15");
            }
        }

        //
        Collections.sort(list, new Comparator<String>() {
            /**
             * 如果要按照升序排序，
             * 则 o1小于o2返回负整数，o1与o2相等返回0，01大于02返回正整数
             * 如果要按照降序排序
             * 则 o1小于o2返回正整数，o1与o2相等返回0，01大于02返回负整数
             * @param o1
             * @param o2
             * @return
             */
            @Override
            public int compare(String o1, String o2) {
                int diff = Integer.valueOf(o1) - Integer.valueOf(o2);
                if (diff >0){
                    return -1;
                }else if (diff<0){
                    return 1;
                }
                return 0;
            }
        });
       // System.out.println(list.toString());
        //降序完成之后再次替换 指定字符
        for (int i = 0; i < list.size(); i++) {
            if ("1".equals(list.get(i))){
                list.set(i,"A");
            }else if ("11".equals(list.get(i))){
                list.set(i,"J");
            }else if ("12".equals(list.get(i))){
                list.set(i,"Q");
            }else if ("13".equals(list.get(i))){
                list.set(i,"K");
            }else if ("14".equals(list.get(i))){
                list.set(i,"小王");
            }else if ("15".equals(list.get(i))){
                list.set(i,"大王");
            }
        }
        return list;
    }




    public static void main(String[] args) {
        //存放每个玩家 和他的扑克牌
        Map<String,List<String>> map = new HashMap<>();
        //打乱顺序后的扑克牌
        Assignment3.generateCards();
        String [] player = {"张三","李四","王五"};
        for (int i = 0; i < player.length; i++) {
            map.put(player[i],new ArrayList<String>());
        }
        for (int i = 0; i < 17; i++) {
            for (int j = 0; j < player.length; j++) {
                map.get(player[j]).add(licensing());
            }
        }
        System.out.println();
        for (int i = 0; i < player.length; i++) {
            System.out.println(player[i]+"手中的牌是:"+map.get(player[i]).toString());
        }

        for (int i = 0; i < player.length; i++) {
            List listSort = Assignment3.Sort(map.get(player[i]));

            System.out.println(player[i]+"手中的牌按照从大到小排序后是:"+listSort.toString()+" "+"共"+listSort.size()+"张");
        }
    }
}
